#include <iostream>
#include "escenario.h"
#include "IteradorLista.h"
#include <fstream>
#include "parser.h"
#include "StringUtils.h"
#include "Dibujador.h"
#include "Logger.h"
#include "SDL.h"
#include "Graficador.h"
#include "Partida.h"
#include "POCMovimiento.h"
#include "Jugador.h"
#include "Sonido.h"
#include "Menu.h"
#include "UsuariosDAO.h"
#include "SalidaTexto.h"
#include "EntradaTexto.h"
#include "Bonus.h"
#include "MenuEstadisticas.h"
#include "MenuEstadisticasRecordsEnGeneral.h"
#include "AltaUsuarios.h"
#include "MenuSeleccionUsuarios.h"
#include "MenuEstadisticasRecordsPorJugadores.h"

using namespace std;

void probarEscenario(Escenario* es){

	cout << "      --- ESCENARIO ---" << endl << endl ;
	cout << "Nombre del escenario:  "<<es->getNombre() << endl << endl;

	cout << "      --- GRILLA ---" << endl << endl;

	IteradorLista<Camino*> itc = es->getGrilla()->getIteradorCaminos();
	while(itc.tieneSiguiente()){
		Camino* c =itc.siguiente();
		cout << "Camino col:  " <<c->getColumna() << endl;
		cout << "Camino fil:  " <<c->getFila() << endl;
		cout << "Camino Bonus Tipo:  "<<c->getBonus()->getTipo() << endl << endl;
	}

	IteradorLista<Obstaculo*> ito = es->getGrilla()->getIteradorObstaculos();
	while (ito.tieneSiguiente()){
		Obstaculo* o1 = ito.siguiente();
		cout << "Obstaculo col:  " <<o1->getColumna() << endl;
		cout << "Obstaculo fil:  " <<o1->getFila() << endl;
		cout << "Obstaculo Tipo:  " <<o1->getTipo() << endl << endl;
	}
	cout << "Obstaculo por defecto:  " <<es->getGrilla()->getTipoDeObstaculoPorDefecto() << endl << endl;
	
	cout << "      --- TIPOS DE BONUS ---" << endl << endl;
	IteradorLista<TipoBonus*> ittb = es->getIteradorTiposBonus();
	while (ittb.tieneSiguiente()){
		TipoBonus* tb = ittb.siguiente();
		cout << "TipoBonus nombre:  " <<tb->getNombre() << endl;
		cout << "TipoBonus textura:  "<<tb->getTextura() << endl << endl;
	}
	
	cout << "      --- TIPOS DE OBSTACULOS ---" << endl << endl;
	IteradorLista<TipoObstaculo*> itto = es->getIteradorTiposObstaculos();
	while(itto.tieneSiguiente()){
		TipoObstaculo* to = itto.siguiente();
		cout << "TipoObstaculo nombre:  "<<to->getNombre() << endl;
		cout << "TipoObstaculo textura:  "<<to->getTextura() << endl << endl;
	}

	cout << "      --- TEXTURAS ---"<<endl;
	IteradorLista<Textura*> ittex = es->getIteradorTexturas();
	while(ittex.tieneSiguiente()){
		Textura* tex = ittex.siguiente();
		cout << "Textura nombre:  "<< tex->getNombre() << endl;
		cout << "Textura path:  "<< tex->getPath() << endl;
	}

	system("PAUSE");

};


int main( int argc, char* args[] ){

	Logger log;

	bool cicloMenuPpal = false;

	// Se loguea el inicio de la ejecucion.
	log.createEntryLog("INICIO DE LA EJECUCION", "", Logger::LOG);

	while(!cicloMenuPpal){
		SDL_Surface* ventana = SDL_SetVideoMode(1024,768,16,SDL_DOUBLEBUF);
		Menu* menuppal = new Menu(ventana);
		menuppal->OnExecute();

		if(menuppal->OpcionElegida()==0){
			MenuSeleccionUsuarios* seleccionUsuarios = new MenuSeleccionUsuarios(ventana);
			seleccionUsuarios->OnExecute();
			
			if (seleccionUsuarios->isSeleccionCompletada()) {
				string nombreUsuario1 = seleccionUsuarios->getUsuario1()->getNombre();
				string nombreUsuario2 = seleccionUsuarios->getUsuario2()->getNombre();
				//delete(seleccionUsuarios);
				
				SDL_FreeSurface(ventana);
				SDL_Quit();
				Partida* aplicacion;


		char* xml = "mapaPacman (2).xml";
		Parser* p = new Parser(xml);

				ObjetoModelo* o = p->buscarEscenario();
				Escenario* es;
				if(o!=NULL){

					if(o->getNombreClase() == "Escenario"){
						es = (Escenario*)o;
						es->validarTipos();
					}

					aplicacion = new Partida(es);
					Jugador* jugador1 = new Jugador(nombreUsuario1);
					Jugador* jugador2 = new Jugador(nombreUsuario2);
					Pacman* pacman1 = new Pacman();
					Pacman* pacman2 = new Pacman();
					jugador1->setPacman(pacman1);
					jugador2->setPacman(pacman2);
					aplicacion->setJugadores(jugador1, jugador2);
					aplicacion->OnExecute();
					delete aplicacion; //agrego juan
				}
			}
			delete seleccionUsuarios;//agrego juan
			delete menuppal;//agrego juan
		}
		else {
			if (menuppal->OpcionElegida()==1) {
				AltaUsuarios* menuUsuarios = new AltaUsuarios(ventana);
				menuUsuarios->OnExecute();
			}
			else {
				if(menuppal->OpcionElegida()==2){
					bool cicloMenuEstadisticas = false;
					while(!cicloMenuEstadisticas){
						MenuEstadisticas* menuppal2 = new MenuEstadisticas(ventana);
						menuppal2->OnExecute();
						if(menuppal2->OpcionElegida()==0){
							MenuEstadisticasRecordsEnGeneral* menuppal3 = new MenuEstadisticasRecordsEnGeneral(ventana);
							menuppal3->OnExecute();
						}
						else if(menuppal2->OpcionElegida()==1){
							MenuEstadisticasRecordsPorJugadores* menuppal4 = new MenuEstadisticasRecordsPorJugadores(ventana);
							menuppal4->OnExecute();
						}
						else if(menuppal2->OpcionElegida()==2){
							cicloMenuEstadisticas = true;
						}
					}
				}
				else {
					if (menuppal->OpcionElegida()==3){
						cicloMenuPpal = true;
						return 0;
					}
				}
			}
		}

	}

	// Se loguea el fin de la ejecucion.
	log.createEntryLog("FIN DE LA EJECUCION", "", Logger::LOG);
	return 0;
}

